
`define CPU_DATA_WIDTH											32
`define CPU_INSTR_WIDTH											32
`define CPU_ADDR_WIDTH											32

`define CPU_COND_NO													8

`define CPU_MAP_PROM_ADDR_WIDTH							8
`define CPU_MAP_PROM_SIZE										256

`define CPU_MICRO_WORD_WIDTH								79
`define CPU_MICRO_ADDR_WIDTH								12		
`define CPU_MICRO_MEM_SIZE									4096		

`define CPU_MICRO_ADDR_A_WIDTH							5
`define CPU_MICRO_ADDR_B_WIDTH							5

//microintruction word format: indexes in succession!
// seq instr field
`define	CPU_MICRO_FLD_INSTR_WIDTH						4
`define	CPU_MICRO_FLD_INSTR_HI_IDX					(`CPU_MICRO_WORD_WIDTH - 1)		
`define	CPU_MICRO_FLD_INSTR_LO_IDX					(`CPU_MICRO_FLD_INSTR_HI_IDX - `CPU_MICRO_FLD_INSTR_WIDTH + 1)
// seq data field
`define	CPU_MICRO_FLD_DATA_WIDTH						12
`define	CPU_MICRO_FLD_DATA_HI_IDX						(`CPU_MICRO_FILED_INSTR_LO_IDX - 1)		
`define	CPU_MICRO_FLD_DATA_LO_IDX						(`CPU_MICRO_FLD_DATA_HI_IDX - `CPU_MICRO_FLD_DATA_WIDTH + 1)
// seq ccen field 
`define	CPU_MICRO_FLD_CCEN_WIDTH						1
`define	CPU_MICRO_FLD_CCEN_HI_IDX						(`CPU_MICRO_FLD_DATA_LO_IDX - 1)		
`define	CPU_MICRO_FLD_CCEN_LO_IDX						(`CPU_MICRO_FLD_CCEN_HI_IDX - `CPU_MICRO_FLD_CCEN_WIDTH + 1)
// seq condition selection field
`define	CPU_MICRO_FLD_COND_SEL_WIDTH				3
`define	CPU_MICRO_FLD_COND_SEL_HI_IDX				(`CPU_MICRO_FLD_CCEN_LO_IDX - 1)		
`define	CPU_MICRO_FLD_COND_SEL_LO_IDX				(`CPU_MICRO_FLD_COND_SEL_HI_IDX - `CPU_MICRO_FLD_COND_SEL_WIDTH + 1)
// alu cin field
`define	CPU_MICRO_FLD_CIN_WIDTH							1
`define	CPU_MICRO_FLD_CIN_HI_IDX						(`CPU_MICRO_FLD_COND_SEL_LO_IDX - 1)		
`define	CPU_MICRO_FLD_CIN_LO_IDX						(`CPU_MICRO_FLD_CIN_HI_IDX - `CPU_MICRO_FLD_CIN_WIDTH + 1)
// alu function field 
`define	CPU_MICRO_FLD_ALU_FN_WIDTH					9
`define	CPU_MICRO_FLD_ALU_FN_HI_IDX					(`CPU_MICRO_FLD_CIN_LO_IDX - 1)		
`define	CPU_MICRO_FLD_ALU_FN_LO_IDX					(`CPU_MICRO_FLD_ALU_FN_HI_IDX - `CPU_MICRO_FLD_ALU_FN_WIDTH + 1)
// alu operand a address field 
`define	CPU_MICRO_FLD_ALU_OP_A_WIDTH				5
`define	CPU_MICRO_FLD_ALU_OP_A_HI_IDX				(`CPU_MICRO_FLD_ALU_FN_LO_IDX - 1)		
`define	CPU_MICRO_FLD_ALU_OP_A_LO_IDX				(`CPU_MICRO_FLD_ALU_OP_A_HI_IDX - `CPU_MICRO_FLD_ALU_OP_A_WIDTH + 1)
// alu operand a address field 
`define	CPU_MICRO_FLD_ALU_OP_B_WIDTH				5
`define	CPU_MICRO_FLD_ALU_OP_B_HI_IDX				(`CPU_MICRO_FLD_ALU_OP_A_LO_IDX - 1)		
`define	CPU_MICRO_FLD_ALU_OP_B_LO_IDX				(`CPU_MICRO_FLD_ALU_OP_B_HI_IDX - `CPU_MICRO_FLD_ALU_OP_B_WIDTH + 1)
// alu data
`define	CPU_MICRO_FLD_ALU_DATA_WIDTH				32
`define	CPU_MICRO_FLD_ALU_DATA_HI_IDX				(`CPU_MICRO_FLD_ALU_OP_B_LO_IDX - 1)		
`define	CPU_MICRO_FLD_ALU_DATA_LO_IDX				(`CPU_MICRO_FLD_ALU_DATA_HI_IDX - `CPU_MICRO_FLD_ALU_DATA_WIDTH + 1)
// operand a select 
`define	CPU_MICRO_FLD_OP_A_SEL_WIDTH				1
`define	CPU_MICRO_FLD_OP_A_SEL_HI_IDX				(`CPU_MICRO_FLD_ALU_DATA_LO_IDX - 1)		
`define	CPU_MICRO_FLD_OP_A_SEL_LO_IDX				(`CPU_MICRO_FLD_OP_A_SEL_HI_IDX - `CPU_MICRO_FLD_OP_A_SEL_WIDTH + 1)
// operand b select 
`define	CPU_MICRO_FLD_OP_B_SEL_WIDTH				1
`define	CPU_MICRO_FLD_OP_B_SEL_HI_IDX				(`CPU_MICRO_FLD_OP_A_SEL_LO_IDX - 1)		
`define	CPU_MICRO_FLD_OP_B_SEL_LO_IDX				(`CPU_MICRO_FLD_OP_B_SEL_HI_IDX - `CPU_MICRO_FLD_OP_B_SEL_WIDTH + 1)
// alu data select
`define	CPU_MICRO_FLD_ALU_DATA_SEL_WIDTH		2
`define	CPU_MICRO_FLD_ALU_DATA_SEL_HI_IDX		(`CPU_MICRO_FLD_OP_B_SEL_LO_IDX - 1)		
`define	CPU_MICRO_FLD_ALU_DATA_SEL_LO_IDX		(`CPU_MICRO_FLD_ALU_DATA_SEL_HI_IDX - `CPU_MICRO_FLD_ALU_DATA_SEL_WIDTH + 1)
// ld instr reg
`define	CPU_MICRO_FLD_LD_INSTR_REG_WIDTH		1
`define	CPU_MICRO_FLD_LD_INSTR_REG_HI_IDX		(`CPU_MICRO_FLD_ALU_DATA_SEL_LO_IDX - 1)		
`define	CPU_MICRO_FLD_LD_INSTR_REG_LO_IDX		(`CPU_MICRO_FLD_LD_INSTR_REG_HI_IDX - `CPU_MICRO_FLD_LD_INSTR_REG_WIDTH + 1)
// ld mem adr reg
`define	CPU_MICRO_FLD_LD_MEM_ADR_REG_WIDTH		1
`define	CPU_MICRO_FLD_LD_MEM_ADR_REG_HI_IDX		(`CPU_MICRO_FLD_LD_INSTR_REG_LO_IDX - 1)		
`define	CPU_MICRO_FLD_LD_MEM_ADR_REG_LO_IDX		(`CPU_MICRO_FLD_LD_MEM_ADR_REG_HI_IDX - `CPU_MICRO_FLD_LD_MEM_ADR_REG_WIDTH + 1)
// mem we
`define	CPU_MICRO_FLD_LD_MEM_WE_WIDTH				1
`define	CPU_MICRO_FLD_LD_MEM_WE_HI_IDX			(`CPU_MICRO_FLD_LD_MEM_ADR_REG_LO_IDX - 1)		
`define	CPU_MICRO_FLD_LD_MEM_WE_LO_IDX			(`CPU_MICRO_FLD_LD_MEM_WE_HI_IDX - `CPU_MICRO_FLD_LD_MEM_WE_WIDTH + 1)
